/**
 * 输入输出处理模块
 * 负责解析输入状态和格式化输出命令
 */

const { GameState } = require('./object');

/**
 * 解析输入状态
 * @param {string} inputData - 输入的JSON字符串
 * @returns {GameState} 解析后的输入状态
 */
function parseInputState(inputData) {
    try {
        const inputState = JSON.parse(inputData.trim());
        return new GameState(inputState);
    } catch (error) {
        console.error(`JSON解析错误: ${error.message}`);
        return {};
    }
}

/**
 * 格式化输出命令
 * @param {Array} commands - 命令列表
 * @returns {string} 格式化的JSON字符串
 */
function formatOutputCommands(commands) {
    try {
        // 确保 commands 是数组
        if (!Array.isArray(commands)) {
            console.warn('commands 不是数组，返回空数组');
            return '[]';
        }
        // 处理命令数组，如果命令有 toDict 方法则调用，否则直接使用
        const cmds = commands.map(cmd => {
            if (cmd && typeof cmd.toDict === 'function') {
                return cmd.toDict();
            }
            return cmd;
        });
        
        // 转换为 JSON 字符串
        return JSON.stringify(cmds, null, 0);
    } catch (error) {
        console.error(`JSON序列化错误: ${error.message}`);
        return '[]';
    }
}

/**
 * 从文件读取输入
 * @param {string} filepath - 文件路径
 * @returns {string} 文件内容
 */
function input(filepath) {
    const fs = require('fs');
    return fs.readFileSync(filepath, 'utf8');
}

/**
 * 输出内容
 * @param {string} s - 要输出的字符串
 * @param {Object} file - 输出流，默认为stdout
 * @param {boolean} isCommands - 是否为命令输出，默认为false
 */
function output(s, file = process.stdout, isCommands = false) {
    // 为commands输出添加特殊标识前缀
    if (file === process.stdout && isCommands) {
        file.write(`COMMANDS_OUTPUT:${s}\n`);
    } else {
        file.write(s + '\n');
    }
}

module.exports = {
    parseInputState,
    formatOutputCommands,
    input,
    output,
};